//                            _ooOoo_  
//                           o8888888o  
//                           88" . "88  
//                           (| -_- |)  
//                            O\ = /O  
//                        ____/`---'\____  
//                      .   ' \\| |// `.  
//                       / \\||| : |||// \  
//                     / _||||| -:- |||||- \  
//                       | | \\\ - /// | |  
//                     | \_| ''\---/'' | |  
//                      \ .-\__ `-` ___/-. /  
//                   ___`. .' /--.--\ `. . __  
//                ."" '< `.___\_<|>_/___.' >'"".  
//               | | : `- \`.;`\ _ /`;.`/ - ` : | |  
//                 \ \ `-. \_ __\ /__ _/ .-` / /  
//         ======`-.____`-.___\_____/___.-`____.-'======  
//                            `=---='  
//  
//         .............................................  
//                  佛祖保佑             永无BUG 
//          佛曰:  
//                  写字楼里写字间，写字间里程序员；  
//                  程序人员写程序，又拿程序换酒钱。  
//                  酒醒只在网上坐，酒醉还来网下眠；  
//                  酒醉酒醒日复日，网上网下年复年。  
//                  但愿老死电脑间，不愿鞠躬老板前；  
//                  奔驰宝马贵者趣，公交自行程序员。  
//                  别人笑我忒疯癫，我笑自己命太贱；  
//                  不见满街漂亮妹，哪个归得程序员？  


/* ****************************************************************************
 * Author: 671643387
 * Date: 2015/9/12
 * ***************************************************************************/

/**
 * 新审计
 * @param query
 * @param resp
 * @param callback
 */
exports.audit1 = function(query, resp, callback){
    if (isNaN(query.minTime) || isNaN(query.maxTime)){
        resp.code = 1; resp.desc = 'invalid params';
        callback(); return;
    }

    var minTime = +query.minTime;
    var maxTime = +query.maxTime;

    minTime = Date.createFromStamp(minTime).zeroMonth();
    maxTime = Date.createFromStamp(maxTime).zeroMonth();
    var timeStamp = minTime;

    var retArr = [];

    async.until(function(){
        return timeStamp > maxTime;
    }, function(cb){
        __collectData(timeStamp, function(err, data){
            if (err) {
                retArr.push([timeStamp]);
            } else {
                retArr.push([timeStamp].concat(data));
            }

            timeStamp = Date.nextMonth(timeStamp);
            cb(null);
        });
    }, function(err){
        resp.code = 0;
        resp.data = retArr;
        callback();
    });
};

///////////////////////////////////////////////////////////////////////////////

function __collectData(timeStamp, fn)
{
    var monthPaySum = 0;        // 当月总收入
    var monthPayPlayers = {};   // 当月充钱的用户OPENID
    var monthNewPlayer = 0;     // 本月新用户
    var monthTotalLoginPlayer = 0;  // 本月总登录用户

    var prevMonthNewPlayer = 0; // 上月新用户
    var prevMonthTotalLoginPlayer = 0;  // 上月总登录用户
    var prevMonthNewPlayerMonthLogin = 0;   // 上月新用户在本月登录的人数
    var prevMonthLoginPlayerMonthLogin = 0; // 上月留存用户本月登录人数

    var nextMonthStamp = Date.nextMonth(timeStamp);
    var prevMonthStamp = Date.prevMonth(timeStamp);

    async.each(gServers.getSids(), function(sid, asecb) {
        var db = gServers.getGameDB(sid);
        if (!db) {
            cb();
            return;
        }

        async.series([
            function(cb){
                var dbPay = db.collection("pay");
                dbPay.group(
                    {openid:1},
                    {ts:{"$gte": timeStamp, "$lt":nextMonthStamp}},
                    {pay:0},
                    function(obj, prev){
                        prev.pay += +obj.amt;
                    },
                    function(err, res){
                        if (err) {
                            ERROR(err);
                        } else {
                            res.forEach(function(item){
                                monthPaySum += +item.pay;
                                monthPayPlayers[item.openid] = 1;
                            });

                        }
                        cb(null);
                    }
                );
            },

            function(cb) {
                // 查询本月新用户
                var SQL = gMysqlPool.format("SELECT * FROM login WHERE reg_time >= ? AND reg_time < ?;",
                    [timeStamp, nextMonthStamp]);
                gMysqlPool.query(SQL, function(err, res){
                    if (err) ERROR(err);
                    else if (res && res.length > 0) {
                        monthNewPlayer = res.length;
                    }
                    cb(null);
                });
            },

            function(cb) {
                // 查询本月总登录用户
                var SQL = gMysqlPool.format("SELECT * FROM login WHERE last_login_time >= ? AND reg_time < ?;",
                    [timeStamp, nextMonthStamp]);
                gMysqlPool.query(SQL, function(err, res){
                    if (err) ERROR(err);
                    else if (res && res.length > 0) {
                        monthTotalLoginPlayer = res.length;
                    }
                    cb(null);
                });
            },

            function(cb) {
                // 查询上月新用户
                var SQL = gMysqlPool.format("SELECT * FROM login WHERE reg_time >= ? AND reg_time < ?;",
                    [prevMonthStamp, timeStamp]);
                gMysqlPool.query(SQL, function(err, res){
                    if (err) ERROR(err);
                    else if (res && res.length > 0) {
                        prevMonthNewPlayer = res.length;
                    }
                    cb(null);
                });
            },

            function(cb) {
                // 查询上月总登录
                var SQL = gMysqlPool.format("SELECT * FROM login WHERE last_login_time >= ? AND reg_time < ?;",
                    [prevMonthStamp, timeStamp]);
                gMysqlPool.query(SQL, function(err, res){
                    if (err) ERROR(err);
                    else if (res && res.length > 0) {
                        prevMonthTotalLoginPlayer = res.length;
                    }
                    cb(null);
                });
            },

            function(cb) {
                // 查询上月新用户在本月的登录人数
                var SQL = gMysqlPool.format("SELECT * FROM login WHERE reg_time >= ? AND reg_time < ? AND last_login_time >= ?;",
                    [prevMonthStamp, timeStamp, timeStamp]);
                gMysqlPool.query(SQL, function(err, res){
                    if (err) ERROR(err);
                    else if (res && res.length > 0) {
                        prevMonthNewPlayerMonthLogin = res.length;
                    }
                    cb(null);
                });
            },

            function(cb) {
                // 查询上月留存本月登录人数
                var SQL = gMysqlPool.format("SELECT * FROM login WHERE reg_time < ? AND last_login_time >= ?;",
                    [prevMonthStamp, timeStamp]);
                gMysqlPool.query(SQL, function(err, res){
                    if (err) ERROR(err);
                    else if (res && res.length > 0) {
                        prevMonthLoginPlayerMonthLogin = res.length;
                    }
                    cb(null);
                });
            }
        ], function(err){
            // 查下一个服务器
            asecb(null);
        });
    }, function(err) {

        var monthPayPlayerNum = Object.keys(monthPayPlayers).length;

        var ARPU = monthPaySum / monthPayPlayerNum;

        fn(null, [
            monthPaySum,                                        // 当月总收入
            monthNewPlayer,                                     // 当月新用户
            monthTotalLoginPlayer,                              // 当月总登录用户
            monthTotalLoginPlayer - monthNewPlayer,             // 当月老用户登录
            monthPayPlayerNum,                                  // 当月付费人数
            0,                                                  // 日均去新用户登录数
            0,                                                  // 日平均最高在线人数
            0,                                                  // 日平均在线人数
            ARPU,                                               // ARPU
            monthPayPlayerNum / monthTotalLoginPlayer,          // 月付费比
            prevMonthNewPlayer / prevMonthNewPlayerMonthLogin,  // 上月新用户本月登录率
            (prevMonthTotalLoginPlayer - prevMonthNewPlayer) / prevMonthLoginPlayerMonthLogin,  // 老用户次月登录率
            0,                                                  // 日均活跃用户登录比
            0,                                                  // 活跃用户均游戏时长
            0,                                                  // PCU / ACU
            0,                                                  // 当月开服数
            0,                                                  // 当月服均导入用户数
            0,                                                  // 当月服均广告用户数
            0,                                                  // 当月广告用户成本
            0,                                                  // 当月广告总成本
        ]);
    });
}